package com.hivemc.chunker.conversion.intermediate.column.chunk.identifier.type.item;

import com.hivemc.chunker.conversion.intermediate.column.blockentity.BannerBlockEntity;
import com.hivemc.chunker.conversion.intermediate.column.blockentity.BlockEntity;
import com.hivemc.chunker.conversion.intermediate.column.blockentity.sign.HangingSignBlockEntity;
import com.hivemc.chunker.conversion.intermediate.column.blockentity.sign.SignBlockEntity;

import java.util.Optional;

/**
 * List of all vanilla item types, note: some types may only be in Bedrock or Java.
 */
public enum ChunkerVanillaItemType implements ChunkerItemType {
    REDSTONE,
    SADDLE,
    MINECART,
    CHEST_MINECART,
    FURNACE_MINECART,
    TNT_MINECART,
    HOPPER_MINECART,
    CARROT_ON_A_STICK,
    WARPED_FUNGUS_ON_A_STICK,
    ELYTRA,
    OAK_BOAT,
    OAK_CHEST_BOAT,
    SPRUCE_BOAT,
    SPRUCE_CHEST_BOAT,
    BIRCH_BOAT,
    BIRCH_CHEST_BOAT,
    JUNGLE_BOAT,
    JUNGLE_CHEST_BOAT,
    ACACIA_BOAT,
    ACACIA_CHEST_BOAT,
    CHERRY_BOAT,
    CHERRY_CHEST_BOAT,
    DARK_OAK_BOAT,
    DARK_OAK_CHEST_BOAT,
    PALE_OAK_BOAT,
    PALE_OAK_CHEST_BOAT,
    MANGROVE_BOAT,
    MANGROVE_CHEST_BOAT,
    BAMBOO_RAFT,
    BAMBOO_CHEST_RAFT,
    TURTLE_HELMET,
    ARMADILLO_SCUTE,
    TURTLE_SCUTE,
    FLINT_AND_STEEL,
    APPLE,
    BOW,
    ARROW,
    COAL,
    CHARCOAL,
    DIAMOND,
    EMERALD,
    LAPIS_LAZULI,
    QUARTZ,
    AMETHYST_SHARD,
    RAW_IRON,
    IRON_INGOT,
    RAW_COPPER,
    COPPER_INGOT,
    RAW_GOLD,
    GOLD_INGOT,
    NETHERITE_INGOT,
    NETHERITE_SCRAP,
    WOODEN_SWORD,
    WOODEN_SHOVEL,
    WOODEN_PICKAXE,
    WOODEN_AXE,
    WOODEN_HOE,
    WOODEN_SPEAR,
    STONE_SWORD,
    STONE_SHOVEL,
    STONE_PICKAXE,
    STONE_AXE,
    STONE_HOE,
    STONE_SPEAR,
    GOLDEN_SWORD,
    GOLDEN_SHOVEL,
    GOLDEN_PICKAXE,
    GOLDEN_AXE,
    GOLDEN_HOE,
    GOLDEN_SPEAR,
    IRON_SWORD,
    IRON_SHOVEL,
    IRON_PICKAXE,
    IRON_AXE,
    IRON_HOE,
    IRON_SPEAR,
    DIAMOND_SWORD,
    DIAMOND_SHOVEL,
    DIAMOND_PICKAXE,
    DIAMOND_AXE,
    DIAMOND_HOE,
    DIAMOND_SPEAR,
    NETHERITE_SWORD,
    NETHERITE_SHOVEL,
    NETHERITE_PICKAXE,
    NETHERITE_AXE,
    NETHERITE_HOE,
    NETHERITE_SPEAR,
    COPPER_SWORD,
    COPPER_SHOVEL,
    COPPER_PICKAXE,
    COPPER_AXE,
    COPPER_HOE,
    COPPER_SPEAR,
    STICK,
    BOWL,
    MUSHROOM_STEW,
    STRING,
    FEATHER,
    GUNPOWDER,
    WHEAT_SEEDS,
    WHEAT,
    BREAD,
    LEATHER_HELMET,
    LEATHER_CHESTPLATE,
    LEATHER_LEGGINGS,
    LEATHER_BOOTS,
    CHAINMAIL_HELMET,
    CHAINMAIL_CHESTPLATE,
    CHAINMAIL_LEGGINGS,
    CHAINMAIL_BOOTS,
    IRON_HELMET,
    IRON_CHESTPLATE,
    IRON_LEGGINGS,
    IRON_BOOTS,
    DIAMOND_HELMET,
    DIAMOND_CHESTPLATE,
    DIAMOND_LEGGINGS,
    DIAMOND_BOOTS,
    GOLDEN_HELMET,
    GOLDEN_CHESTPLATE,
    GOLDEN_LEGGINGS,
    GOLDEN_BOOTS,
    NETHERITE_HELMET,
    NETHERITE_CHESTPLATE,
    NETHERITE_LEGGINGS,
    NETHERITE_BOOTS,
    COPPER_HELMET,
    COPPER_CHESTPLATE,
    COPPER_LEGGINGS,
    COPPER_BOOTS,
    FLINT,
    PORKCHOP,
    COOKED_PORKCHOP,
    PAINTING,
    GOLDEN_APPLE,
    ENCHANTED_GOLDEN_APPLE,
    OAK_SIGN(SignBlockEntity.class),
    SPRUCE_SIGN(SignBlockEntity.class),
    BIRCH_SIGN(SignBlockEntity.class),
    JUNGLE_SIGN(SignBlockEntity.class),
    ACACIA_SIGN(SignBlockEntity.class),
    CHERRY_SIGN(SignBlockEntity.class),
    DARK_OAK_SIGN(SignBlockEntity.class),
    PALE_OAK_SIGN(SignBlockEntity.class),
    MANGROVE_SIGN(SignBlockEntity.class),
    BAMBOO_SIGN(SignBlockEntity.class),
    CRIMSON_SIGN(SignBlockEntity.class),
    WARPED_SIGN(SignBlockEntity.class),
    OAK_HANGING_SIGN(HangingSignBlockEntity.class),
    SPRUCE_HANGING_SIGN(HangingSignBlockEntity.class),
    BIRCH_HANGING_SIGN(HangingSignBlockEntity.class),
    JUNGLE_HANGING_SIGN(HangingSignBlockEntity.class),
    ACACIA_HANGING_SIGN(HangingSignBlockEntity.class),
    CHERRY_HANGING_SIGN(HangingSignBlockEntity.class),
    DARK_OAK_HANGING_SIGN(HangingSignBlockEntity.class),
    PALE_OAK_HANGING_SIGN(HangingSignBlockEntity.class),
    MANGROVE_HANGING_SIGN(HangingSignBlockEntity.class),
    BAMBOO_HANGING_SIGN(HangingSignBlockEntity.class),
    CRIMSON_HANGING_SIGN(HangingSignBlockEntity.class),
    WARPED_HANGING_SIGN(HangingSignBlockEntity.class),
    BUCKET,
    WATER_BUCKET,
    LAVA_BUCKET,
    POWDER_SNOW_BUCKET,
    SNOWBALL,
    LEATHER,
    MILK_BUCKET,
    PUFFERFISH_BUCKET,
    SALMON_BUCKET,
    COD_BUCKET,
    TROPICAL_FISH_BUCKET,
    AXOLOTL_BUCKET,
    TADPOLE_BUCKET,
    BRICK,
    CLAY_BALL,
    PAPER,
    BOOK,
    SLIME_BALL,
    EGG,
    BLUE_EGG,
    BROWN_EGG,
    COMPASS,
    LODESTONE_COMPASS,
    RECOVERY_COMPASS,
    BUNDLE,
    BLACK_BUNDLE,
    BLUE_BUNDLE,
    BROWN_BUNDLE,
    CYAN_BUNDLE,
    GRAY_BUNDLE,
    GREEN_BUNDLE,
    LIGHT_BLUE_BUNDLE,
    LIGHT_GRAY_BUNDLE,
    LIME_BUNDLE,
    MAGENTA_BUNDLE,
    ORANGE_BUNDLE,
    PINK_BUNDLE,
    PURPLE_BUNDLE,
    RED_BUNDLE,
    WHITE_BUNDLE,
    YELLOW_BUNDLE,
    FISHING_ROD,
    CLOCK,
    SPYGLASS,
    GLOWSTONE_DUST,
    COD,
    SALMON,
    TROPICAL_FISH,
    PUFFERFISH,
    COOKED_COD,
    COOKED_SALMON,
    INK_SAC,
    GLOW_INK_SAC,
    COCOA_BEANS,
    WHITE_DYE,
    ORANGE_DYE,
    MAGENTA_DYE,
    LIGHT_BLUE_DYE,
    YELLOW_DYE,
    LIME_DYE,
    PINK_DYE,
    GRAY_DYE,
    LIGHT_GRAY_DYE,
    CYAN_DYE,
    PURPLE_DYE,
    BLUE_DYE,
    BROWN_DYE,
    GREEN_DYE,
    RED_DYE,
    BLACK_DYE,
    BONE_MEAL,
    BONE,
    SUGAR,
    COOKIE,
    FILLED_MAP,
    SHEARS,
    MELON_SLICE,
    DRIED_KELP,
    PUMPKIN_SEEDS,
    MELON_SEEDS,
    BEEF,
    COOKED_BEEF,
    CHICKEN,
    COOKED_CHICKEN,
    ROTTEN_FLESH,
    ENDER_PEARL,
    BLAZE_ROD,
    GHAST_TEAR,
    GOLD_NUGGET,
    NETHER_WART,
    POTION,
    GLASS_BOTTLE,
    SPIDER_EYE,
    FERMENTED_SPIDER_EYE,
    BLAZE_POWDER,
    MAGMA_CREAM,
    ENDER_EYE,
    GLISTERING_MELON_SLICE,
    SPAWN_EGG,
    EXPERIENCE_BOTTLE,
    FIRE_CHARGE,
    WRITABLE_BOOK,
    WRITTEN_BOOK,
    ITEM_FRAME,
    GLOW_ITEM_FRAME,
    CARROT,
    POTATO,
    BAKED_POTATO,
    POISONOUS_POTATO,
    MAP,
    GOLDEN_CARROT,
    NETHER_STAR,
    PUMPKIN_PIE,
    FIREWORK_ROCKET,
    FIREWORK_STAR,
    ENCHANTED_BOOK,
    NETHER_BRICK,
    PRISMARINE_SHARD,
    PRISMARINE_CRYSTALS,
    RABBIT,
    COOKED_RABBIT,
    RABBIT_STEW,
    RABBIT_FOOT,
    RABBIT_HIDE,
    ARMOR_STAND,
    IRON_HORSE_ARMOR,
    GOLDEN_HORSE_ARMOR,
    DIAMOND_HORSE_ARMOR,
    LEATHER_HORSE_ARMOR,
    COPPER_HORSE_ARMOR,
    NETHERITE_HORSE_ARMOR,
    WOLF_ARMOR,
    LEAD,
    NAME_TAG,
    COMMAND_BLOCK_MINECART,
    MUTTON,
    COOKED_MUTTON,
    WHITE_BANNER(BannerBlockEntity.class),
    ORANGE_BANNER(BannerBlockEntity.class),
    MAGENTA_BANNER(BannerBlockEntity.class),
    LIGHT_BLUE_BANNER(BannerBlockEntity.class),
    YELLOW_BANNER(BannerBlockEntity.class),
    LIME_BANNER(BannerBlockEntity.class),
    PINK_BANNER(BannerBlockEntity.class),
    GRAY_BANNER(BannerBlockEntity.class),
    LIGHT_GRAY_BANNER(BannerBlockEntity.class),
    CYAN_BANNER(BannerBlockEntity.class),
    PURPLE_BANNER(BannerBlockEntity.class),
    BLUE_BANNER(BannerBlockEntity.class),
    BROWN_BANNER(BannerBlockEntity.class),
    GREEN_BANNER(BannerBlockEntity.class),
    RED_BANNER(BannerBlockEntity.class),
    BLACK_BANNER(BannerBlockEntity.class),
    END_CRYSTAL,
    CHORUS_FRUIT,
    POPPED_CHORUS_FRUIT,
    TORCHFLOWER_SEEDS,
    PITCHER_POD,
    BEETROOT,
    BEETROOT_SEEDS,
    BEETROOT_SOUP,
    DRAGON_BREATH,
    SPLASH_POTION,
    SPECTRAL_ARROW,
    TIPPED_ARROW,
    LINGERING_POTION,
    SHIELD(BannerBlockEntity.class),
    TOTEM_OF_UNDYING,
    SHULKER_SHELL,
    IRON_NUGGET,
    COPPER_NUGGET,
    KNOWLEDGE_BOOK,
    DEBUG_STICK,
    MUSIC_DISC_13,
    MUSIC_DISC_CAT,
    MUSIC_DISC_BLOCKS,
    MUSIC_DISC_CHIRP,
    MUSIC_DISC_FAR,
    MUSIC_DISC_MALL,
    MUSIC_DISC_MELLOHI,
    MUSIC_DISC_STAL,
    MUSIC_DISC_STRAD,
    MUSIC_DISC_WARD,
    MUSIC_DISC_11,
    MUSIC_DISC_WAIT,
    MUSIC_DISC_OTHERSIDE,
    MUSIC_DISC_RELIC,
    MUSIC_DISC_5,
    MUSIC_DISC_PIGSTEP,
    MUSIC_DISC_CREATOR,
    MUSIC_DISC_CREATOR_MUSIC_BOX,
    MUSIC_DISC_PRECIPICE,
    MUSIC_DISC_TEARS,
    MUSIC_DISC_LAVA_CHICKEN,
    DISC_FRAGMENT_5,
    TRIDENT,
    PHANTOM_MEMBRANE,
    NAUTILUS_SHELL,
    HEART_OF_THE_SEA,
    CROSSBOW,
    SUSPICIOUS_STEW,
    FLOWER_BANNER_PATTERN,
    CREEPER_BANNER_PATTERN,
    SKULL_BANNER_PATTERN,
    MOJANG_BANNER_PATTERN,
    GLOBE_BANNER_PATTERN,
    PIGLIN_BANNER_PATTERN,
    BORDURE_INDENTED_BANNER_PATTERN,
    FIELD_MASONED_BANNER_PATTERN,
    FLOW_BANNER_PATTERN,
    GUSTER_BANNER_PATTERN,
    GOAT_HORN,
    SWEET_BERRIES,
    GLOW_BERRIES,
    HONEYCOMB,
    HONEY_BOTTLE,
    ECHO_SHARD,
    BRUSH,
    NETHERITE_UPGRADE_SMITHING_TEMPLATE,
    SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE,
    DUNE_ARMOR_TRIM_SMITHING_TEMPLATE,
    COAST_ARMOR_TRIM_SMITHING_TEMPLATE,
    WILD_ARMOR_TRIM_SMITHING_TEMPLATE,
    WARD_ARMOR_TRIM_SMITHING_TEMPLATE,
    EYE_ARMOR_TRIM_SMITHING_TEMPLATE,
    VEX_ARMOR_TRIM_SMITHING_TEMPLATE,
    TIDE_ARMOR_TRIM_SMITHING_TEMPLATE,
    SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE,
    RIB_ARMOR_TRIM_SMITHING_TEMPLATE,
    SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE,
    WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE,
    SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE,
    SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE,
    RAISER_ARMOR_TRIM_SMITHING_TEMPLATE,
    HOST_ARMOR_TRIM_SMITHING_TEMPLATE,
    BOLT_ARMOR_TRIM_SMITHING_TEMPLATE,
    FLOW_ARMOR_TRIM_SMITHING_TEMPLATE,
    ANGLER_POTTERY_SHERD,
    ARCHER_POTTERY_SHERD,
    ARMS_UP_POTTERY_SHERD,
    BLADE_POTTERY_SHERD,
    BREWER_POTTERY_SHERD,
    BURN_POTTERY_SHERD,
    DANGER_POTTERY_SHERD,
    EXPLORER_POTTERY_SHERD,
    FLOW_POTTERY_SHERD,
    FRIEND_POTTERY_SHERD,
    GUSTER_POTTERY_SHERD,
    HEART_POTTERY_SHERD,
    HEARTBREAK_POTTERY_SHERD,
    HOWL_POTTERY_SHERD,
    MINER_POTTERY_SHERD,
    MOURNER_POTTERY_SHERD,
    PLENTY_POTTERY_SHERD,
    PRIZE_POTTERY_SHERD,
    SCRAPE_POTTERY_SHERD,
    SHEAF_POTTERY_SHERD,
    SHELTER_POTTERY_SHERD,
    SKULL_POTTERY_SHERD,
    SNORT_POTTERY_SHERD,
    TRIAL_KEY,
    OMINOUS_TRIAL_KEY,
    OMINOUS_BOTTLE,
    WIND_CHARGE,
    BREEZE_ROD,
    MACE,
    RESIN_BRICK,
    BLACK_HARNESS,
    BLUE_HARNESS,
    BROWN_HARNESS,
    CYAN_HARNESS,
    GRAY_HARNESS,
    GREEN_HARNESS,
    LIGHT_BLUE_HARNESS,
    LIGHT_GRAY_HARNESS,
    LIME_HARNESS,
    MAGENTA_HARNESS,
    ORANGE_HARNESS,
    PINK_HARNESS,
    PURPLE_HARNESS,
    RED_HARNESS,
    WHITE_HARNESS,
    YELLOW_HARNESS,
    IRON_NAUTILUS_ARMOR,
    GOLDEN_NAUTILUS_ARMOR,
    DIAMOND_NAUTILUS_ARMOR,
    COPPER_NAUTILUS_ARMOR,
    NETHERITE_NAUTILUS_ARMOR,
    ;

    private final Class<? extends BlockEntity> blockEntityClass;

    ChunkerVanillaItemType(Class<? extends BlockEntity> blockEntityClass) {
        this.blockEntityClass = blockEntityClass;
    }

    ChunkerVanillaItemType() {
        this(null);
    }

    @Override
    public Optional<Class<? extends BlockEntity>> getBlockEntityClass() {
        return Optional.ofNullable(blockEntityClass);
    }
}
